#include <string>
#include <iostream>
#include <bits/stdc++.h>

// std::string的使用
// reference: https://learn.microsoft.com/zh-cn/cpp/standard-library/basic-string-class?view=msvc-170
int main(int argc, const char **argv)
{
    //! 1. 构造string对象
    // std::string s = "Hello World";        std::cout << s << std::endl;    // 直接构造

    // 声明
    // 定义
    // std::string s;  s = "Hello World";    std::cout << s << std::endl;    // 先声明，再赋值
    // std::string s("Hello World");         std::cout << s << std::endl;    // 使用构造函数
    // std::string s(5, 'x');                std::cout << s << std::endl;    // 类似std::vector的构造函数
    // std::string s1 = "Hello World", s2;  s2 = s1;  std::cout << s2 << std::endl;               // 赋值构造函数
    // std::string s1 = "Hello ", s2 = "World", s3; s3 = s1 + s2;  std::cout << s3 << std::endl;  // 字符串拼接

    //! 2. 访问string对象
    std::string s = "Hello World";
    // char c = s[1];    std::cout << c << std::endl;    // 获取某个索引的值，得到一个char
    // char c = s.at(1);
    // std::cout << c << std::endl; // 获取某个索引的值，得到一个char
    // auto pos  = s.find("or");  
    // if (pos != std::string::npos) {
    //     std::cout << pos  << std::endl;     // 查找子串(首个匹配)
    // }

    // auto rpos = s.rfind("or");  std::cout << rpos << std::endl;     // 查找子串(最后一个匹配)

    // auto pos = s.find_first_of("eo");   std::cout << pos  << std::endl;  // 最早出现'e'或者'o'的位置
    // auto pos = s.find_last_of("eo");    std::cout << pos  << std::endl;  // 最早出现'e'或者'o'的位置

    // auto str = s.substr(0, 5);       std::cout << str << std::endl;    // 取子串{start pos, length}
    // auto str = s.substr(2, -1);      std::cout << str << std::endl;    // 取子串{start pos, end}
    // auto str = s.substr(2);          std::cout << str << std::endl;    // 取子串{start pos}

    //! 3. 修改string对象
    // s[1] = 'm';    std::cout << s << std::endl;                                   // 修改单个字符
    // std::string str = s + ", I'm from China!";  std::cout << str << std::endl;    // 字符串拼接
    // s.append(", I'm from China!");              std::cout << s << std::endl;    // 字符串拼接

    // "Hello World" ==> "HAllo World"  ?  "HAHAHAHllo World"
    // std::string a = "HHHHHHH";
    // s.replace(0, 2, a.c_str());      std::cout << s << std::endl;    // 子串替换 str > range
    // s.replace(0, 2, "x");            std::cout << s << std::endl;    // 子串替换 str < range

    //! 4. std::string与其它类型转换
    const char* ss1 = "wfwef\0\0";
    const char* ss2 = "wfwef\0";
    // std::string str1 = ss1;
    // printf("len = %ld, size = %ld\n", str.length(), str.size());
    printf("strlen = %ld, strlen = %ld\n", std::strlen(ss1), std::strlen(ss2));

    return 0;
}
